<?php
defined('_IN_CMS') or die('Fuck off');

class Article extends Db
{
    // Класс для управления статьями

    use data, face, rights;

    public $data; // Данные статьи
    public $link; // Для БД

    public function __construct()
    {
        // Стандартные данные статьи
        $this->data['id'] = 0;
        $this->data['date'] = date('d.m.Y');
        $this->data['section'] = 0;
        $this->data['section_title'] = 'default';
        $this->data['category'] = 0;
        $this->data['category_title'] = 'default';
        $this->data['ip'] = '127.0.0.1';
        $this->data['ua'] = 'Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.10.229 Version/11.60';
        $this->data['author_login'] = 'miha';
        $this->data['author_name'] = 'Михаил';
        $this->data['title'] = 'Статья не найдена';
        $this->data['description'] = 'Статья не найдена';
        $this->data['article'] = 'Извините, но статья не найдена. Убедитесь, что адрес набран верно.';
        $this->data['source'] = '';
        $this->data['views'] = 0;
        $this->data['url_name'] = 'default';
        $this->data['tags'] = '';
    }

    public function delete()
    {
        // Удаление статьи или изображения из статьи
        if (isset($_GET['article_id'])) { // Если приняли номер статьи
            $this->data['id'] = (int)$_GET['article_id'];
            if (isset($_GET['article_image'])) {
                // Только удаляем изображение из статьи (при редактировании)
                $img_to_del = $_GET['article_image']; // Подстрока, которую нужно удалить
                $result = self::db_query("SELECT `images`, `id` FROM `".core::$table_name['articles']."` WHERE 
                                        (`id` = '".$this->data['id']."') LIMIT 1 --");
                if (mysql_num_rows($result) > 0) {
                    $images = mysql_result($result, 0, 'images');
                    $images = str_replace('  ', ' ', trim(str_replace($img_to_del, '', $images))); // Только хардкор
                }
                // Записать новый массив изображений
                self::db_query("UPDATE `".core::$table_name['articles']."` SET `images` = '$images' WHERE `id` = ".$this->data['id']." LIMIT 1 --");
                if (file_exists('./articles/images/'.$this->data['id'].'/'.$img_to_del.'.jpg')) {
                    unlink('./articles/images/'.$this->data['id'].'/'.$img_to_del.'.jpg');
                }
                echo '<META HTTP-EQUIV="Refresh" CONTENT="0; URL=add_article.php?edit='.$this->data['id'].'">
                Если у тебя отключено автоматическое перенаправление, попробуй перейти по этой 
                        <a href="add_article.php?edit='.$this->data['id'].'" class="redirect_link" title="Последние статьи">ссылке</a>';
            } else {
                // Удалить статью
                self::db_query("DELETE FROM `".core::$table_name['articles']."` WHERE `id` = '".$this->data['id']."' LIMIT 1 --");
                // Удалить комментарии к этой статье
                self::db_query("DELETE FROM `comments00` WHERE `article_id` = '".$this->data['id']."'");
                if (file_exists('./articles/thumbs/'.$this->data['id'].'.jpg')) {
                    unlink('./articles/thumbs/'.$this->data['id'].'.jpg');
                }
                if (is_dir('./articles/images/'.$this->data['id'])) {
                    full_del_dir('./articles/images/'.$this->data['id']);
                }
                echo '<META HTTP-EQUIV="Refresh" CONTENT="0; URL=article.php?last">
                        Если у тебя отключено автоматическое перенаправление, попробуй перейти по этой 
                        <a href="article.php?last" class="redirect_link" title="Последние статьи">ссылке</a>';
            }
        }
    }
    
    public function showArticle(&$user)
    {
        
        // Показать статью
        $this->data['url_name'] = $_GET['url_name']; // Имя статьи на транслите
        $_SESSION['article_view'] = (int)$this->data['id']; // Номер просматриваемой статьи
        if ((self::can($user, 1)) || (self::can($user, 6)) || (self::can($user, 7))) {
            // Если SVI
            // Если пользователь в группе №6 (просмотр статей)
            // Если пользователь в группе №7 (просмотр скрытых статей)
            $article_sql = self::db_query("SELECT `".core::$table_name['articles']."`.`id` AS 'article_id', `".core::$table_name['articles']."`.`url_name`, 
            `".core::$table_name['articles']."`.`section` AS 'sec_id', `".core::$table_name['articles']."`.`category` AS 'cat_id', `".core::$table_name['articles']."`.`article`, 
            `".core::$table_name['articles']."`.`title` AS 'article_title', 
            `".core::$table_name['articles']."`.`tags`, `articles_sections`.`title` AS 'art_title', `".core::$table_name['articles']."`.`author` AS 'author_id', 

            `users00`.`id` AS 'author_id', `users00`.`login` AS 'author_login',
            `articles_sections`.`id` AS 'section_id', `articles_categories`.`id` AS 'category_id', 
            `articles_categories`.`title` AS 'cat_title'

            FROM `".core::$table_name['articles']."`, `articles_sections`, `articles_categories`, `users00`

            WHERE `".core::$table_name['articles']."`.`section` = `articles_sections`.`id` 
            AND `".core::$table_name['articles']."`.`category` = `articles_categories`.`id` 
            AND `".core::$table_name['articles']."`.`url_name` = '".$this->data['url_name']."'
            AND `users00`.`id` = `".core::$table_name['articles']."`.`author` 
            LIMIT 1 --");

            if (mysql_num_rows($article_sql) > 0) {
                // Если есть такая статья
                // Счётчик просмотров статьи
                $this->data['id'] = mysql_result($article_sql, 0, 'article_id');
                $this->data['who_watch_it'] = $user->id;
                self::db_query("UPDATE `".core::$table_name['articles']."` SET `views` = `views` + 1 
                WHERE `".core::$table_name['articles']."`.`id` = '".$this->data['id']."' LIMIT 1 --");
                // Разделяем строку с именами на части и заносим в массив
                $this->data['url_name'] = mysql_result($article_sql, 0, 'url_name');
                $this->data['section'] = mysql_result($article_sql, 0, 'sec_id');
                $this->data['category'] = mysql_result($article_sql, 0, 'cat_id');
                $this->data['title'] = mysql_result($article_sql, 0, 'article_title');
                $this->data['section_title'] = $_GET['section']; // blender
                $this->data['category_title'] = $_GET['category']; // beginner
                $this->data['author_id'] = mysql_result($article_sql, 0, 'author_id');
                $this->data['author_login'] = mysql_result($article_sql, 0, 'author_login');
                $this->data['text'] = mysql_result($article_sql, 0, 'article'); //, $this->data['id']; //, $images_a;
                $this->data['tags'] = mysql_result($article_sql, 0, 'tags');
                $this->data['text'] = $this->filter_smileys($this->filter_bb($this->img_convert($this->data['id'], $this->data['text'], 'x')));
                
                $article_bookmarks_sql = self::db_query("SELECT * FROM `articles_bookmarks` WHERE `article_id` = ".$this->data['id']." AND `user_id` = ".$user->id." LIMIT 1 --");
                if (mysql_num_rows($article_bookmarks_sql) > 0) {
                    $this->data['added'] = 1;
                } else {
                    $this->data['added'] = 0;
                }
                $this->showArticleFace($this->data);
            } else { 
                // Если ноль записей
                $this->printError('Привет. Если ты видишь этот текст, то знай, 
                что ты сделал что-то не так. Попробуй перезагрузить компьютер. ');
            }
        } else {
            // Нет прав для просмотра 
            $this->printError('У тебя нет прав для просмотра статьи');
        }
    }
    
    public function showShort($numb, &$user)
    {
        // Метод выводит краткий список последних статей
        $numb = (int)$numb;
        $lastarticles = self::db_query("SELECT 
        `".core::$table_name['articles']."`.`date`, `".core::$table_name['articles']."`.`category`, `".core::$table_name['articles']."`.`section`, 
        `".core::$table_name['articles']."`.`author`, `".core::$table_name['articles']."`.`title`, 
        `".core::$table_name['articles']."`.`description`, `".core::$table_name['articles']."`.`url_name`, 
        `".core::$table_name['articles']."`.`hidden`, `".core::$table_name['articles']."`.`id` AS 'art_id',
        `articles_sections`.`id`, `articles_sections`.`title` AS 'sec_title', 
        `articles_categories`.`id`, `articles_categories`.`title` AS 'cat_title',
        `users00`.`id`, `users00`.`login` AS 'author_login', 
        `".core::$table_name['articles']."`.`comm_count`, `".core::$table_name['articles']."`.`views`
        FROM `".core::$table_name['articles']."`, `articles_sections`, `articles_categories`, `users00`
        WHERE (`hidden` = FALSE) AND 
            `users00`.`id` = `".core::$table_name['articles']."`.`author` AND
            `".core::$table_name['articles']."`.`section` = `articles_sections`.`id` AND
            `".core::$table_name['articles']."`.`category` = `articles_categories`.`id`
        ORDER BY `".core::$table_name['articles']."`.`id` DESC LIMIT 0, $numb --");

        if (Db::$use_pdo) {
            if (1 > 0) {
                echo $this->db_rowCount();
            } else {
                $this->printError('Нет статей');
            }
        } else {
            if (mysql_num_rows($lastarticles) > 0) {
                while ($row = mysql_fetch_array($lastarticles))
                {
                    $this->data['id']              = $row["art_id"];
                    $this->data['section']         = $row["section"];
                    $this->data['category']        = $row["category"];
                    $this->data['cat_title']       = $row["cat_title"];
                    $this->data['sec_title']       = $row["sec_title"];
                    $this->data['title']           = $row["title"];
                    $this->data['description']     = htmlspecialchars($row["description"]);
                    $this->data['date']            = date('d.m.Y', strtotime($row["date"]));
                    $this->data['author_login']    = $row["author_login"];
                    $this->data['url_name']        = $row["url_name"];
                    $this->data['comm_count']      = $row["comm_count"];
                    $this->data['views']           = $row["views"];
                    $this->data['link_to_article'] = 'articles/'.$this->data['sec_title'].'/'.$this->data['cat_title'].'/'.$this->data['url_name'];
                    if (self::can($user, 1)) {
                        // Если пльзователь имеет права SVI, 
                        // то он может удалять любые статьи
                        $this->data['can_delete'] = 1;
                    } else {
                        $this->data['can_delete'] = 0;
                    }

                    if (!file_exists('data/articles/'.$this->data['id'].'/thumb.jpg')) {
                        $this->data['img_src'] = '/data/articles/default_thumb.png';
                    } else {
                        $this->data['img_src'] = '/data/articles/'.$this->data['id'].'/thumb.jpg';
                    }
                    $this->showArticleItem($this->data);
                }
                echo '
                    <div id="parent_popup" onclick="document.getElementById(\'parent_popup\').style.display=\'none\'; 
                        document.getElementById(\'popup\').style.display=\'none\';">
                    </div>
                    <div id="popup" onmousedown="dragOBJ(this, event); return false;" style="height: 130px; padding: 4px 2px;">
                        <div id="popup_header">Предупреждение</div>
                        <div style="height: 64px; line-height: 64px; text-align: center;">
                            Ты действительно хочешь удалить статью?
                        </div>
                        <div class="button_login" style="float: right;  width: 130px; cursor: pointer;" onClick="document.getElementById(\'parent_popup\').style.display=\'none\'; 
                            document.getElementById(\'popup\').style.display=\'none\';">
                            Нет
                        </div>
                        <div class="button_login" id="item_id" value="0" style="cursor: pointer;" onClick="delete_item(\'article\', this.value); 
                            document.getElementById(\'parent_popup\').style.display=\'none\'; 
                            document.getElementById(\'popup\').style.display=\'none\'; 
                            document.getElementById(\'list_item\'+this.value).style.display=\'none\';">Да
                        </div>
                    </div>';
            } else {
                $this->printError('Нет статей');
            }
        }
    }
    
    public function showSections(&$user)
    {
        // Показать секции по адресу /articles/
        $sec_list = self::db_query("SELECT * FROM `articles_sections` LIMIT 10 --");

        if (mysql_num_rows($sec_list) > 0) {
            for ($i = 0; $i < mysql_num_rows($sec_list); $i++)
            {
                $this->data['id'] = mysql_result($sec_list, $i, "id");
                $this->data['title'] = mysql_result($sec_list, $i, "title");
                $this->data['full_title'] = mysql_result($sec_list, $i, "full_title");
                $this->data['description'] = mysql_result($sec_list, $i, "description");
                if ($user::can($user, 1)) {
                    $this->data['can_delete'] = 1;
                } else {
                    $this->data['can_delete'] = 0;
                }
                $this->showSectionsFace($this->data);
            }
        } else {
            $this->printError('Нет ни одной секции');
        }
        
    }       
    
    public function showCategories($numb)
    {
        // Показываем категории из секции
        $this->data['section'] = $_GET['section'];

        $cat_list = self::db_query("SELECT 
            `articles_categories`.`id` AS 'cat_id', 
            `articles_categories`.`section` AS 'cat_in_sec_id', 
            `articles_categories`.`title` AS 'cat_title', 
            `articles_categories`.`description`, `articles_categories`.`full_title`,
            `articles_sections`.`id` AS 'sec_id', `articles_sections`.`title` AS `sec_title` 
             FROM 
             `articles_categories`, `articles_sections` 
            WHERE 
            `articles_categories`.`section` = `articles_sections`.`id` AND
            `articles_sections`.`title` = '".$this->data['section']."'");
            
        if (mysql_num_rows($cat_list) > 0) {
            // Если есть категории
            for ($i = 0; $i < mysql_num_rows($cat_list); $i++) {
                $this->data['cat_id'] = mysql_result($cat_list, $i, "cat_id");
                $this->data['cat_title'] = mysql_result($cat_list, $i, "cat_title");
                $this->data['full_title'] = mysql_result($cat_list, $i, "full_title");
                $this->data['description'] = mysql_result($cat_list, $i, "description");
                $this->showCategoriesFace($this->data);
            }
        } else {
            $this->printError('Нет ни одной категории в этой секции');
        }
    }
    
    public function showArticles($numb)
    {
        // Показать статьи из категории
        $section_title = $_GET['section']; // blender
        $category_title = $_GET['category']; // rendering

        $sql = "SELECT 
            `".core::$table_name['articles']."`.`id` AS 'art_id', `".core::$table_name['articles']."`.`section`, 
            `".core::$table_name['articles']."`.`category`, `".core::$table_name['articles']."`.`title`, 
            `".core::$table_name['articles']."`.`description`, `".core::$table_name['articles']."`.`date`, 
            `".core::$table_name['articles']."`.`author` AS 'author_id', `".core::$table_name['articles']."`.`url_name`, 
            `articles_categories`.`id` AS 'cat_id', `articles_categories`.`title` AS 'cat_title', 
            `articles_sections`.`id` AS 'sec_id', `articles_sections`.`title` AS 'sec_title', 
            `users00`.`login`
            FROM
            `".core::$table_name['articles']."`, `articles_sections`, `articles_categories`, users00
            WHERE 
            `".core::$table_name['articles']."`.`section` = `articles_sections`.`id` AND
            `".core::$table_name['articles']."`.`category` = `articles_categories`.`id` AND
            `articles_sections`.`title` = '$section_title' AND
            `articles_categories`.`title` = '$category_title' AND
            `users00`.`id` = `".core::$table_name['articles']."`.`author`";
        $art_list = self::db_query($sql);

        $zebra = 1;
        if (mysql_num_rows($art_list) > 0) {
            // Если есть статьи
            for($i = 0; $i < mysql_num_rows($art_list); $i++) {
                // То выводим список
                $this->data['id'] = mysql_result($art_list, $i, "art_id");
                $this->data['section'] = mysql_result($art_list, $i, "section");
                $this->data['category'] = mysql_result($art_list, $i, "category");
                $this->data['title'] = mysql_result($art_list, $i, "title");
                $this->data['description'] = mysql_result($art_list, $i, "description");
                $this->data['date'] = mysql_result($art_list, $i, "date");
                $this->data['author_login'] = mysql_result($art_list, $i, "login");
                $this->data['url_name'] = mysql_result($art_list, $i, "url_name");
                $this->data['section_title'] = $section_title;
                $this->data['cat_title'] = $category_title;
                $this->showArticlesFace($this->data);
            }
        }
        else {
            $this->printError('Статей пока нет');
        }
    }
    
    public function addArticle(&$user)
    {
        // Добавление статьи
        // Данные приходят по POST
        if ($this::can($user, 1)) {
            if (isset($_POST['title']) && isset($_POST['section']) && isset($_POST['category']) && 
                isset($_POST['source']) && isset($_POST['description']) && isset($_POST['article'])) {
                $this->data['id'] = 0; // Номер статьи
                $this->data['date'] = date("d.m.Y H:i:s"); // Текущая дата
                $this->data['ip'] = $user->ip; // IP-адрес автора
                $this->data['ua'] = $user->ua; // User-Agent автора
                $this->data['author_login'] = $user->login; // Логин автора
                $this->data['author_name'] = $user->name; // Имя автора

                $this->data['section'] = (int)$_POST['section']; // Номер секции
                $this->data['category'] = (int)$_POST['category']; // Номер категории
                $this->data['title'] = $_POST['title']; // Заголовок
                $this->data['description'] = $_POST['description']; // Описание
                $this->data['text'] = $_POST['article']; // Текст статьи
                $this->data['source'] = $_POST['source']; // Источник
                $this->data['url_name'] = getTranslated($_POST['title']);
                $this->data['tags'] = $_POST['tags'];
            }

            $this->data['title'] = $this->data['title']; // Максимальная длина заголовка * 2
            $this->data['source'] = $this->data['source']; // Максимальная длина источника * 2
            $this->data['description'] = $this->data['description']; // Максимальная длина описания * 2
            $this->data['text'] = $this->data['text']; // Максимальная длина заголовка * 2
            $this->data['tags'] = $this->data['tags']; // Максимальная длина заголовка * 2
            $this->data['url_name'] = $this->data['url_name']; // Название статьи на транслите
            $this->data['author_id'] = $user->id;

            $this->printMessage("Статья создана");

            // Записываем статью в БД
            self::db_query("INSERT INTO `".core::$table_name['articles']."` 
            (`section`, `category`, `ip`, `ua`, `author`, `title`, `description`, `article`, `url_name`, `source`, `tags`, `empty`) 
            VALUES ('".$this->data['section']."', '".$this->data['category']."', '".$this->data['ip']."', '".$this->data['ua']."', 
            '".$this->data['author_id']."', '".$this->data['title']."', '".$this->data['description']."', '".$this->data['text']."', 
            '".$this->data['url_name']."', '".$this->data['source']."', '".$this->data['tags']."', 0) --");
        }
    }
    
    public function editArticle()
    {
        $id_of_article = (int)$_POST['insert_id'];
        $title = $_POST['title'];
        $section = (int)$_POST['section'];
        $category = (int)$_POST['category'];
        $source = $_POST['source'];
        $description = $_POST['description'];
        $article = $_POST['article'];
        $tags = $_POST['tags'];
        $ip = $_SESSION['ip'];
        $ua = $_SESSION['ua'];

        // Фильтруем принятые данные
        $title = $title;                           // Максимальная длина заголовка * 2
        $source = $source;                   // Максимальная длина источника * 2
        $description = $description;      // Максимальная длина описания * 2
        $article = $article;                 // Максимальная длина заголовка * 2
        $tags = $tags;                     // Максимальная длина заголовка * 2
        $trans = $title;                   // Название статьи на транслите
        $author = $_SESSION['id']; // Логин автора статьи

        // Скопировать пустой index.php в директорию статьи
        copy('data/articles/index.php', 'data/articles/'.$id_of_article.'/index.php');

        echo 'Статья успешно изменена<br>
        <META HTTP-EQUIV="Refresh" CONTENT="0; URL=/add_article/edit/'.$id_of_article.'/">';

        // Обновляем статью в БД
        self::db_query("UPDATE `".core::$table_name['articles']."` SET 
        `section` = '$section', 
        `category` = '$category', 
        `ip` = '$ip', 
        `ua` = '$ua', 
        `author` = '$author', 
        `title` = '$title', 
        `description` = '$description', 
        `article` = '$article', 
        `source` = '$source', 
        `tags` = '$tags' 
        WHERE `".core::$table_name['articles']."`.`id` = '$id_of_article' LIMIT 1 --");
        $_SESSION['article_added'] = '1';
    }

    public function addComment(&$user)
    {
        // Добавление комментария к статье
        $text = $_POST['article'];
        $author = (int)$user->id;
        $article_id = (int)$_POST['article_id'];
        $redirect_url = $_POST['redirect_url'];

        self::db_query("INSERT INTO `comments00` (`id`,`article`,`date`,`author`,`text`)
        VALUES (NULL, '$article_id', CURRENT_TIMESTAMP, '$user->id', '$text')");
        
        // Увеличиваем счётчик комментариев
        self::db_query("UPDATE `".core::$table_name['articles']."` SET `comm_count` = `comm_count` + 1 
            WHERE `".core::$table_name['articles']."`.`id` = '$article_id' LIMIT 1 --");
            
        echo 'Комментарий добавлен<br>
        <META HTTP-EQUIV="Refresh" CONTENT="0; URL='.$redirect_url.'">
        Если у тебя отключено автоперенаправление, то можешь перейти по <a href="'.$redirect_url.'">ссылке</a>';
    }

    public function showFavorite($user_id)
    {
        // Вывод избранных статей одного пользователя

        $favorite = self::db_query("SELECT 
        `articles_bookmarks`.`article_id`, `articles_bookmarks`.`user_id`,         
        `".core::$table_name['articles']."`.`date`, `".core::$table_name['articles']."`.`category`, `".core::$table_name['articles']."`.`section`,
        `".core::$table_name['articles']."`.`author`, `".core::$table_name['articles']."`.`title`, 
        `".core::$table_name['articles']."`.`description`, `".core::$table_name['articles']."`.`url_name`, 
        `".core::$table_name['articles']."`.`hidden`, `".core::$table_name['articles']."`.`id` AS 'art_id',
        `articles_sections`.`id`, `articles_sections`.`title` AS 'sec_title', 
        `articles_categories`.`id`, `articles_categories`.`title` AS 'cat_title',
        `users00`.`id`, `users00`.`login` AS 'author_login', 
        `".core::$table_name['articles']."`.`comm_count`, `".core::$table_name['articles']."`.`views`
        FROM `".core::$table_name['articles']."`, `articles_sections`, `articles_categories`, `users00`, `articles_bookmarks`
        WHERE `hidden` = FALSE AND 
            `".core::$table_name['articles']."`.`id` = `articles_bookmarks`.`article_id` AND
            `users00`.`id` = `".core::$table_name['articles']."`.`author` AND
            `".core::$table_name['articles']."`.`section` = `articles_sections`.`id` AND
            `".core::$table_name['articles']."`.`category` = `articles_categories`.`id` AND
            `articles_bookmarks`.`user_id` = '$user_id'
        ORDER BY `".core::$table_name['articles']."`.`id` DESC  --");

        if (mysql_num_rows($favorite) > 0) {
            while ($row = mysql_fetch_array($favorite))
            {
                $this->data['id']              = $row["article_id"];
                $this->data['cat_title']       = $row["cat_title"];
                $this->data['sec_title']       = $row["sec_title"];
                $this->data['title']           = $row["title"];
                $this->data['description']     = $row["description"];
                $this->data['date']            = date('d.m.Y', strtotime($row["date"]));
                $this->data['date']            = $row["date"];
                $this->data['author_login']    = $row["author_login"];
                $this->data['url_name']       = $row["url_name"];
                $this->data['comm_count']      = $row["comm_count"];
                $this->data['views']           = $row["views"];
                $this->data['link_to_article'] = $link_to_article = 'articles/'.$this->data['sec_title'].'/'.$this->data['cat_title'].'/'.$this->data['url_name'];

                // Если файл эскиза статьи не существует, 
                // то указываем в его качестве стандартный эскиз
                if (!file_exists('data/articles/'.$this->data['id'].'/thumb.jpg')) {
                    $this->data['img_src'] = '/data/articles/default_thumb.png';
                } else {
                    $this->data['img_src'] = '/data/articles/'.$this->data['id'].'/thumb.jpg';
                }

                $this->showArticleItem($this->data);
            }
        } else {
            $this->printError('Нет статей в избранном');
        }
        
    }

}

?>
